How We Know Who We Are
This recent election season exposed deep divides within Christians from different denominations. We still don’t have good data on exactly how Christians voted–exit polls are not reliable or useful for this question–but it is clear that there are substantial differences among Christians of different ages, churches and ethnicities. In particular, a lot of attention in the media centered on U.S. evangelical Christians, a very broad term that nonetheless is a good predictor of how people vote in elections.
I wanted to look more concretely at the question of what an evangelical Christian is. Instead of defining the term by what an evangelical Christian should be, I examined the question from the perspective of what American say about themselves. The best data source for this question are the Pew surveys on religion and politics, the most recent of which was just released. Although the survey dates from 2014, it is the best available evidence because it used a very large sample–over 30,000 respondents–and contained a battery of questions concerning both religious and political views. For that reason, it is ideal for understanding what it means to be evangelical.
There are different ways of slicing and dicing this survey. We could, for example, take the question from the survey that asks people if they are evangelical Christians, and then restrict our focus to only this group. However, the evangelical label has been stretched and challenged by so many people that it seems it can describe people with remarkably contrasting beliefs.
Instead, I used a statistical model to collapse the survey’s questions down to two dimensions. I didn’t know ahead of time what dimensions these would be, although I suspected that it would collapse to a left-right political scale and a conservative-liberal theology scale. The data analysis largely confirms my prior suspicions. The table below shows the three questions that best explained each of the two dimensions:
| Do you believe in God or a universal spirit? |
Do you prefer small or big government? |
| How important is religion in your life? |
Does government aid to the poor do more harm than good? |
| Is the Bible the Word of God? |
Are you conservative/moderate/liberal? |
| Should homosexuality be accepted by society? |
Should homosexuality be accepted by society? |
I decided to label the first dimension as religious belief and the second dimension as political opinions. The first appears to measure the difference between secular-liberal and conservative religious beliefs, such as whether a person believes in God and believes that the Bible is the Word of God. The top question for the second dimension reflects a fundamental divide between the political left and the political right: the size of government. Similarly, the second-most divisive political question concerns a perennial debate over the welfare state and whether the government should be involved. What is interesting to note is that the question about homosexuality discriminates on both dimensions. Knowing someone’s views about homosexuality communicates information about both their religious and political beliefs, so we will certainly examine this question to understand how it fits in the picture.
The plot below shows respondents plotted along these dimensions. We can see from the general shape of the points that there is an oblong, Milky Way galaxy-type shape. This is because people tend to cluster in the top left, liberal religion and liberal politics, and on the bottom right, which is conservative religion and conservative politics. However, there are people who mix and match these beliefs, as they fall into the other two cells. People who are at the exact center are very difficult to classify using either dimension. These are the special cupcakes in the population: they don’t conform to our simplistic analysis of religion and politics. But for a large number of Americans, these two dimensions do tell us a lot.
We can use the other questions in the survey to analyze how people differ along their demographic background and political opinions, including religious denominations, age, income, government policies, and theological perspectives.
First of all, we can look at the list of religious groups to see how they all stack up against each other. We use a question from the survey that tracked a considerable number of religious categories so that we can look at evangelical Christians compared others. We plot each of these categories on our chart to see how they stand relative to all the respondents. The chart below shows the scores on the first dimensions, religious belief, for several different denominations and religious categories.
This plot should be interpreted with caution because it is using a limited number of questions to differentiate respondents along basic beliefs, such as belief in God and whether God’s word is inspired. However, it is still interesting that Evangelical Protestants are closer to Muslims than they are to Mainline Protestants or even Jewish people. This graph does seem to capture some intuitive idea about how close and far different religious groups are, at least when it comes to belief in God and the relative proximity between religious groups. As the Catholic philosopher Peter Kreeft once joked,
I often find more mutual understanding between myself and a fundamentalist Southern Baptist who sincerely believes I am worshipping the great whore of Babylon and on my way to Hell, or with a Muslim who uncompromisingly rejects my belief that Christ is Lord as utter pagan blasphemy, than I find with some active Catholic laity, nuns, especially ex-nuns, priests and even bishops!
These differences reflect a more cultural understanding of faith than they do deep issues of doctrine.
Next we look at demographic factors. First, do people of varying incomes tend to cluster in certain categories? The chart below shows that income does not vary much along religious beliefs (the horizontal dimension), but rather mostly along the vertical dimension, political opinion. Again, this finding is not surprising given how we know that wealthier people in the United States tend to be more conservative. It should be noted too, that these lines are just estimates–it is most likely that people in these income categories will fall in between these lines, but you can find plenty of respondents on the plot that don’t fall into these neat buckets. What it does tell us is that, regardless of anything else, including religious belief, wealthier people are more conservative. On the other hand, we don’t know whether a wealthy person is necessarily more or less conservative when it comes to religion: there are both conservative and liberal wealthy respondents.
Next we’ll look at education. This chart shows that the effect education is very different from income–while income tells us how politically conservative or liberal someone is, education is much more likely to tell us how conservative or liberal their religion is. There are people who are politically conservative who are well-educated, but at the same time these same people also tend to be more liberal in terms of their beliefs.
Given these two differing effects of income and education, we can learn something by putting the lines onto the same plot, making cross-hatch. (Yes, we are literally putting people in boxes). Now we have a bunch of pick-up sticks laid on top of our chart. While it is a bit too much to absorb, it shows how income and education have a complicated interaction when it comes to people’s religious and political beliefs. To give just one interesting interpretation, there is a big box of people who have a very high income (more than $150K) but low education (high school or less). These people tend to have very conservative politics but their religious beliefs are more conservative. On the flip side, the box with people with high income and high education shows that they are more liberal politically, although they also have more conservative beliefs. In other words, people are complicated, and we can’t always know people’s beliefs just by knowing only their education or income.
Now we’re going to dig deep into how people identify in terms of religion and what that says about their politics. First, we’ll look at responses to the question, “How often do you share your faith with non-believers or people from other religious backgrounds?” We see that this question generally corresponds to what we know of religious belief: those who share their faith “once or twice a month or more” tend to also have more conservative beliefs. In addition, there is a slight leftward tilt to the lines, which implies that these people also tend to be more liberal politically. It’s not a very strong relationship, but it is there, and it is quite interesting. Essentially, it means that people who share their faith a lot are in general more conservative in their religious beliefs. But when we look at people who are equally conservative in religious belief, those who share their faith more are also somewhat more liberal (or moderate) politically.
[1] 1.963 0.415
Another important part of faith is praying. The chart below shows the predicted lines for a question that asks respondents how often they pray. Again, we see that praying is a good indicator of whether someone is more conservative religiously. We also see the same, even slighter, leftward tilt, implying that regardless of belief, people who pray a lot will tilt (ever so slightly) liberal politically.
Finally, let’s look at how often people attend church (or place of worship), which is also a core component of all religions. These lines show an even more pronounced leftward tilt. This chart means that people who attend church are much more likely to be more conservative in their religious beliefs, but at the same time their political opinions are just a bit more liberal than fellow believers who don’t attend church.
Now that we’ve diagnosed the very interesting relationship between religious belief and religious practice, we can look at divisive political and religious questions that were asked respondents. First, we’ll use a question that measures the exclusivity of people’s religious commitments. This question asked, “is your religion the one, true faith leading to eternal life, or can many religions lead to eternal life?” We only put one line on the chart below because this is a simple yes/no question. Those to the right of the line said that their religion is exclusive, while those to the left said that many religions can lead to eternal life. This question does not tell us much, if anything, about someone’s political views, but it does clearly delineate those who are very conservative in their religious beliefs from those who aren’t.
We first look at the question on homosexuality, which we know is very divisive on both dimensions. This question asked respondents, “should homosexuality be discouraged by society?” Unlike religious practice, this question has a strong rightward tilt. This means that those who think homosexuality should be discouraged are more likely to be conservative politically and religiously. This question would appear to exemplify the divide between the groups that match conservative religious beliefs to conservative politics and vice versa.
While homosexuality is a social question with clear religious and political connotations, we can look at whether other political questions are similarly divisive along religious lines. The question below asks respondents whether they think government aid to the poor does more harm than good. The slant on this line is similar to the question on homosexuality, though not as steep. People who believe that the government aid to the poor harms the poor are more likely to be conservative religiously and politically, although the relationship with religion is much weaker. It is also interesting that this line goes straight through the middle of the chart. Those who aren’t sure about whether aid does more harm or good are also those who are politically moderates.
Next we’ll examine environmental policy. This question asked respondents whether stricter environmental regulations are worth the added cost. This question also breaks down along both religious and political lines: people who think environmental regulations are more important tend to be more liberal politically and religously, although the effect is stronger for their political ideology than for religion.
Based on our analysis so far, we know that core political questions, such as welfare, environmental regulations, and homosexuality can all divide people on both religious and political grounds. The strongest divide is on homosexuality. However, we also find that there is a difference between religious belief and religious practice. People who are similarly conservative in religious belief differ in their political views depending on how much they practice their faith. Those who practice their faith more tend to be slightly more liberal politically as well.
This was a preliminary analysis, and these conclusions aren’t firm. But they do indicate the nature of politics and religion in America today, and the issues that divide us and unite us. Also, we shouldn’t just think of religious identity as a list of questions but also as a list of practices. When we note that certain political issues tend to divide Americans on both religious and political grounds, we can’t assume that all Americans are equally devoted to their religious traditions even if they believe them to be true. As is often the case, reality is more complicated than our limited perspectives allow it to be.
LS0tCnRpdGxlOiAiV2hvIEFyZSBVUyBFdmFuZ2VsaWNhbCBDaHJpc3RpYW5zPyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgpsaWJyYXJ5KGhhdmVuKQpyZXF1aXJlKGRwbHlyKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUobWFncml0dHIpCnJlcXVpcmUobWlydCkKcmVxdWlyZSh0aWR5cikKcmVxdWlyZShwbG90bHkpCnJlcXVpcmUoc3RyaW5ncikKcmVxdWlyZShrbml0cikKCm9wdHNfY2h1bmskc2V0KGZpZy5hbGlnbj0nY2VudGVyJykKCnNldC5zZWVkKDExMTM3OSkKCkRhdGFzZXRfUGV3IDwtIHJlYWRfc2F2KCJEYXRhc2V0IC0gUGV3IFJlc2VhcmNoIENlbnRlciAyMDE0IFJlbGlnaW91cyBMYW5kc2NhcGUgU3R1ZHkgTmF0aW9uYWwgVGVsZXBob25lIFN1cnZleSAtIFZlcnNpb24gMS4xIC0gRGVjZW1iZXIgMSAyMDE2LnNhdiIpCgojTmVlZCB0byByZWxhYmVsL3JlbGV2ZWwgc29tZSB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcmVmZXJlbmNlIGNhdGVnb3JpZXMKCkRhdGFzZXRfUGV3JFJFTFRSQUQgPC0gYXNfZmFjdG9yKERhdGFzZXRfUGV3JFJFTFRSQUQpCkRhdGFzZXRfUGV3JFJFTFRSQUQgPC0gcmVsZXZlbChEYXRhc2V0X1BldyRSRUxUUkFELCJEb24ndCBrbm93L3JlZnVzZWQgLSBubyBpbmZvcm1hdGlvbiBvbiByZWxpZ2lvdXMgaWRlbnRpdHkiKQpsZXZlbHMoRGF0YXNldF9QZXckUkVMVFJBRCkgPC0gYygiRG9uJ3QgS25vdyIsIkV2YW5nZWxpY2FsPGJyPlByb3Rlc3RhbnQiLCJNYWlubGluZTxicj5Qcm90ZXN0YW50IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmxhY2s8YnI+UHJvdGVzdGFudCIsICJDYXRob2xpYyIsICJNb3Jtb24iLCAiT3J0aG9kb3g8YnI+Q2hyaXN0aWFuIiwgIkplaG92YWgnczxicj5XaXRuZXNzIiwiT3RoZXI8YnI+Q2hyaXN0aWFuIiwiSmV3aXNoIiwiTXVzbGltIiwiQnVkZGhpc3QiLCJIaW5kdSIsIk90aGVyPGJyPlJlbGlnaW9ucyIsIk90aGVyPGJyPkZhaXRocyIsIk5vbmUiKQoKRGF0YXNldF9QZXckUkVMVFJBRCA8LSByZWNvZGVfZmFjdG9yKERhdGFzZXRfUGV3JFJFTFRSQUQsJ090aGVyPGJyPlJlbGlnaW9ucyc9Ik90aGVyPGJyPkZhaXRocyIpCgpsZXZlbHMoRGF0YXNldF9QZXckUkVMVFJBRCkgPC0gYygiRG9uJ3QgS25vdyIsIkJ1ZGRoaXN0IiwiRXZhbmdlbGljYWw8YnI+UHJvdGVzdGFudCIsIk1haW5saW5lPGJyPlByb3Rlc3RhbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJCbGFjazxicj5Qcm90ZXN0YW50IiwgIkNhdGhvbGljIiwgIk1vcm1vbiIsICJPcnRob2RveDxicj5DaHJpc3RpYW4iLCAiSmVob3ZhaCdzPGJyPldpdG5lc3MiLCJPdGhlcjxicj5DaHJpc3RpYW4iLCJKZXdpc2giLCJNdXNsaW0iLCJIaW5kdSIsIk90aGVyPGJyPkZhaXRocyIsIk5vbmUiKQoKRGF0YXNldF9QZXckaW5jb21lIDwtIHN0cl9leHRyYWN0KGFzLmNoYXJhY3Rlcihhc19mYWN0b3IoRGF0YXNldF9QZXckaW5jb21lKSkscGF0dGVybiA9ICdcXCRbMS05XSsuKycpCkRhdGFzZXRfUGV3JGluY29tZSA8LSBhc19mYWN0b3IoRGF0YXNldF9QZXckaW5jb21lKQpsZXZlbHMoRGF0YXNldF9QZXckcWkyZykgPC0gYygnTmV2ZXInLCdTZWxkb20nLCAnU2V2ZXJhbCB0aW1lcyBhIHllYXInLCdPbmNlIG9yIHR3aWNlIGEgbW9udGgnLCdBdCBsZWFzdCBvbmNlIGEgd2VlaycpCgpkYXRhIDwtIERhdGFzZXRfUGV3CgojTmVlZCB0byB1c2Ugc3VydmV5IHdlaWdodHMuIFdvbid0IGNoYW5nZSBhY3R1YWwgYW5hbHlzaXMgdmVyeSBtdWNoLCBidXQgc3RpbGwgYSBnb29kIHRoaW5nIHRvIGRvCgp3ZWlnaHRzIDwtIERhdGFzZXRfUGV3JFdFSUdIVAoKIyBLZWVwIHZhcmlhYmxlcwoKZGF0YSAlPD4lIHNlbGVjdChxaTJnLHFpMmQscWkyYixxaTJhLHFpMSxxaDIscWgxLHFnN2IscWc3LHFnNixxZzUscWcxYyxxZzMscWcxLHFnMWIscWYyLAogICAgICAgICAgICAgICAgIGF0dGVuZCxib3JuLHJhY2V0aG4sbWFyaXRhbCxxYjMxLHFiMzAscWIyMixxYjIxLHFiMjAsCiAgICAgICAgICAgICAgICAgcWIyMSxxYjIyLHFiMjAscWIyYSxxYjJjLHFiMmIscWIyZCxxYjFjLHFiMWIscWIxYSxxYTEscWkzLHFwM3JlYyxlZHVjLGFnZXJlYywKICAgICAgICAgICAgICAgICBxbTVhLHFtNWIscW01ZCxxbTVlLHFtNWYscW01ZyxwYXJ0eSxpZGVvLGluY29tZSxSRUxUUkFEKQoKb3JkaW5hbF92YXJzIDwtIGMoJ3FpMmcnLCdxaTJkJywncWkyYicsJ3FpMmEnLCdxaTEnLCdxZzFiJywncWYyJywnYXR0ZW5kJywncWIyMicsJ3FiMjEnLCdxYjFjJywKICAgICAgICAgICAgICAgICAgJ3FiMWInLCdxYjFhJywncWExJywnZWR1YycsJ2FnZXJlYycsJ2lkZW8nLCdpbmNvbWUnKQpiaW5hcnlfdmFycyA8LSBjKCdxaDInLCdxaDEnLCdxZzcnLCdxZzdiJywncWc2JywncWc1JywncWcxYycsJ3FnMycsJ3FnMScsJ2Jvcm4nLCdxYjMwJywncWIyMCcsCiAgICAgICAgICAgICAgICAgJ3FiMmEnLCdxYjJjJywncWIyYicsJ3FiMmQnLCdxaTMnLCdxcDNyZWMnLCdxbTVhJywncW01YicsJ3FtNWQnLCdxbTVlJywncW01ZicsJ3FtNWcnKQpub21pbmFsX3ZhcnMgPC0gbmFtZXMoZGF0YSlbIShuYW1lcyhkYXRhKSAlaW4lIGMob3JkaW5hbF92YXJzLGJpbmFyeV92YXJzKSldCgphbGxfdmFycyA8LSBjKG9yZGluYWxfdmFycyxiaW5hcnlfdmFycyxub21pbmFsX3ZhcnMpCgojIE9yZGVyIGJ5IHRoZXNlIGNhdGVnb3JpZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29kZSB0aGVtIGZvciB0aGUgSVJUIG1vZGVsCgpkYXRhICU8PiUgc2VsZWN0KG9uZV9vZihjKG9yZGluYWxfdmFycyxiaW5hcnlfdmFycyxub21pbmFsX3ZhcnMpKSkKCmRhdGEgJTw+JSBhc19mYWN0b3IoJ2xhYmVscycpCgprZWVwX2xhYmVscyA8LSBsYXBwbHkoZGF0YSxsZXZlbHMpCgpkYXRhICU8PiUgbXV0YXRlX2FsbChmdW5zKGlmZWxzZShncmVwbCh4PS4scGF0dGVybj0iVk9MfE5hTnxbRGRdb24ndCBbS2tdbm93fFtScl1lZnVzZWR8VW5kZXNpZ25hdGVkfERpZCBOb3QgUmVwb3J0IiksTkEsLikpKQoKa2VlcF9sYWJlbHMgPC0gbGFwcGx5KGtlZXBfbGFiZWxzLGZ1bmN0aW9uKHgpIHsKICB4WyFncmVwbCh4PXgscGF0dGVybj0iVk9MfE5hTnxbRGRdb24ndCBbS2tdbm93fFtScl1lZnVzZWR8VW5kZXNpZ25hdGVkfERpZCBOb3QgUmVwb3J0IildCn0pCmtlZXBfbmFtZXMgPC0gbmFtZXMoZGF0YSkKZGF0YSA8LSAgbGFwcGx5KDE6bGVuZ3RoKG5hbWVzKGRhdGEpKSxmdW5jdGlvbih4KSB7CiAgdGhpc19jb2wgPC0gZGF0YVtbeF1dCiAgdGhpc19jb2wgPC0gZmFjdG9yKHRoaXNfY29sLGxhYmVscz1rZWVwX2xhYmVsc1tbeF1dKQogIHJldHVybih0aGlzX2NvbCkKfSkKbmFtZXMoZGF0YSkgPC0ga2VlcF9uYW1lcwpkYXRhICU8PiUgYXNfZGF0YV9mcmFtZQoKaXRlbV90eXBlcyA8LSBjKHJlcCgnZ3JhZGVkJyxsZW5ndGgob3JkaW5hbF92YXJzKSksCiAgICAgICAgICAgICAgICByZXAoJzJQTCcsbGVuZ3RoKGJpbmFyeV92YXJzKSksCiAgICAgICAgICAgICAgICByZXAoJ25vbWluYWwnLGxlbmd0aChub21pbmFsX3ZhcnMpKSkKCmRhdGEgJTw+JSBtdXRhdGUoUkVMVFJBRCA9IHJlbGV2ZWwoUkVMVFJBRCwnT3RoZXI8YnI+RmFpdGhzJykpCmxldmVscyhkYXRhJGluY29tZSkgPC0gYygnJDEwLDAwMCcsJyQyMCwwMDAnLCckMzAsMDAwJywnJDQwLDAwMCcsJyQ1MCwwMDAnLCckNzUsMDAwJywnJDEwMCwwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICckMTUwLDAwMCcsJyQxNTAsMDAwIG9yIG1vcmUnKQoKZGF0YSRlZHVjIDwtIGZhY3RvcihkYXRhJGVkdWMsbGV2ZWxzPSBjKCJMZXNzIHRoYW4gaGlnaCBzY2hvb2wgKEdyYWRlcyAxLTggb3Igbm8gZm9ybWFsIHNjaG9vbGluZykiLAogICAgICAgICAgICAgICAgICAgICAgICJIaWdoIHNjaG9vbCBpbmNvbXBsZXRlIChHcmFkZXMgOS0xMSBvciBHcmFkZSAxMiB3aXRoIE5PIGRpcGxvbWEpIiwKICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBzY2hvb2wgZ3JhZHVhdGUgKEdyYWRlIDEyIHdpdGggZGlwbG9tYSBvciBHRUQgY2VydGlmaWNhdGUpIiwKICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBjb2xsZWdlLCBubyBkZWdyZWUgKGluY2x1ZGVzIHNvbWUgY29tbXVuaXR5IGNvbGxlZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAiVHdvIHllYXIgYXNzb2NpYXRlIGRlZ3JlZSBmcm9tIGEgY29sbGVnZSBvciB1bml2ZXJzaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAiRm91ciB5ZWFyIGNvbGxlZ2Ugb3IgdW5pdmVyc2l0eSBkZWdyZWUvQmFjaGVsb3IncyBkZWdyZWUgKGUuZy4sIEJTLCBCQSwgQUIpIiwKICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBwb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIHNjaG9vbGluZywgbm8gcG9zdGdyYWR1YXRlIGRlZ3JlZSAoZS5nLiBzb21lIGdyYWR1YXRlIHNjaG9vbCkiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIGRlZ3JlZSwgaW5jbHVkaW5nIG1hc3RlcidzLCBkb2N0b3JhdGUsIG1lZGljYWwgb3IgbGF3IGRlZ3JlZSAoZS5nLiwgTUEsIE1TLCBQaEQsIE1ELi4uKSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCdNaWRkbGUgU2Nob29sJywnU29tZSBIUycsJ0hTIEdyYWQnLCdTb21lIENvbGxlZ2UnLCcyLXlyIERlZ3JlZScsJzQteXIgRGVncmVlJywnU29tZSBHcmFkIFNjaG9vbCcsJ0dyYWQgRGVncmVlJykpCgojT25lIG9mIHRoZSBxdWVzdGlvbnMgaGFzIHZlcnkgb2RkIHF1ZXN0aW9uIG9yZGVyLCBuZWVkIHRvIGNoYW5nZSB0byBtYWtlIGZ1bGx5IG9yZGluYWwKCmRhdGEkcWIxYSA8LSBmYWN0b3IoZGF0YSRxYjFhLGxldmVscz1jKCJDaGFuZ2UgZm9yIHRoZSBiZXR0ZXIiLCJIYXNuJ3QgbWFkZSBtdWNoIGRpZmZlcmVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlIGZvciB0aGUgd29yc2UiKSkKZGF0YSRxYjFiIDwtIGZhY3RvcihkYXRhJHFiMWIsbGV2ZWxzPWMoIkNoYW5nZSBmb3IgdGhlIGJldHRlciIsIkhhc24ndCBtYWRlIG11Y2ggZGlmZmVyZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFuZ2UgZm9yIHRoZSB3b3JzZSIpKQpkYXRhJHFiMWMgPC0gZmFjdG9yKGRhdGEkcWIxYyxsZXZlbHM9YygiQ2hhbmdlIGZvciB0aGUgYmV0dGVyIiwiSGFzbid0IG1hZGUgbXVjaCBkaWZmZXJlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5nZSBmb3IgdGhlIHdvcnNlIikpCgpudW1lcmljIDwtIGRhdGEubWF0cml4KGRhdGEpCmNvbG5hbWVzKG51bWVyaWMpIDwtIG5hbWVzKGRhdGEpCgojVW5pZGltZW5zaW9uYWwgMlBMIFJhc2NoIGNvbWJpbmVkIG9yZGluYWwvYmluYXJ5L25vbWluYWwgZmFjdG9yIGFuYWx5c2lzCiNJZiB5b3UgZ2V0IGFuIGVycm9yLCBqdXN0IHJlcnVuIHRoaXMgY29kZS4gU29tZXRpbWVzIHRoZSBFTSBhbGdvcml0aG0gY2FuIGdldCBzdHVjayBpbiBhIGZsYXQgbG9nLWxpa2VsaWhvb2QKbW9kZWwgPC0gbWlydChudW1lcmljLG1vZGVsPTIsaXRlbXR5cGU9aXRlbV90eXBlcyxzdXJ2ZXkud2VpZ2h0cz13ZWlnaHRzKQpwZXJzb25fc2NvcmVzIDwtIGZzY29yZXMobW9kZWwpICU+JSBhc19kYXRhX2ZyYW1lCgojTmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbi9tYXggcG9pbnRzIGZvciBwbG90dGluZwojV2UgZG9uJ3QgbmVlZCB0byB1c2UgYWxsIHRoZSBzY29yZXMgZm9yIHRoZXNlIGNhbGN1bGF0aW9ucywganVzdCBhIHNhbXBsZQpzYW1wbGVfc2NvcmVzIDwtIHNhbXBsZV9uKHBlcnNvbl9zY29yZXMsMTUwMCkKI1dlIG5lZWQgdG8ga25vdyBtaW4vbWF4IG9uIGFsbCBkaW1lbnNpb25zIGZvciBwbG90dGluZyB0aGUgbGluZXMgY29ycmVjdGx5Cm1hdHJpeF9zY29yZXMgPC0gYXMubWF0cml4KHNhbXBsZV9zY29yZXMpCnJlY3RhbmdsZV9zY29yZXMgPC0gcmJpbmQoc2FtcGxlX3Njb3Jlc1ssXSkKICBjKG1pbihzYW1wbGVfc2NvcmVzJEYxKSxtYXgoc2FtcGxlX3Njb3JlcyRGMSksCiAgICAgICAgICAgICAgICAgICAgICBtaW4oc2FtcGxlX3Njb3JlcyRGMiksbWF4KHNhbXBsZV9zY29yZXMkRjIpKQpuYW1lcyhyZWN0YW5nbGVfc2NvcmVzKSA8LSBjKCdtaW5feCcsJ21heF94JywnbWluX3knLCdtYXhfeScpCgojIE5lZWQgdG8gdXNlIHRoZSBzYW1lIHJvdGF0aW9uIGFzIHRoZSBwZXJzb24gc2NvcmVzCmFsbF9jb2VmcyA8LSBjb2VmKG1vZGVsLHJvdGF0ZT0nb2JsaW1pbicpCgphbGxfY29lZnMkR3JvdXBQYXJzIDwtIE5VTEwKYGBgCgojIyMgSG93IFdlIEtub3cgV2hvIFdlIEFyZQoKVGhpcyByZWNlbnQgZWxlY3Rpb24gc2Vhc29uIGV4cG9zZWQgZGVlcCBkaXZpZGVzIHdpdGhpbiBDaHJpc3RpYW5zIGZyb20gZGlmZmVyZW50IGRlbm9taW5hdGlvbnMuIFdlIHN0aWxsIGRvbid0IGhhdmUgZ29vZCBkYXRhIG9uIGV4YWN0bHkgaG93IENocmlzdGlhbnMgdm90ZWQtLWV4aXQgcG9sbHMgYXJlIG5vdCByZWxpYWJsZSBvciB1c2VmdWwgZm9yIHRoaXMgcXVlc3Rpb24tLWJ1dCBpdCBpcyBjbGVhciB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCBkaWZmZXJlbmNlcyBhbW9uZyBDaHJpc3RpYW5zIG9mIGRpZmZlcmVudCBhZ2VzLCBjaHVyY2hlcyBhbmQgZXRobmljaXRpZXMuIEluIHBhcnRpY3VsYXIsIGEgbG90IG9mIGF0dGVudGlvbiBpbiB0aGUgbWVkaWEgY2VudGVyZWQgb24gVS5TLiBldmFuZ2VsaWNhbCBDaHJpc3RpYW5zLCBhIHZlcnkgYnJvYWQgdGVybSB0aGF0IG5vbmV0aGVsZXNzIGlzIGEgZ29vZCBwcmVkaWN0b3Igb2YgaG93IHBlb3BsZSB2b3RlIGluIGVsZWN0aW9ucy4KCkkgd2FudGVkIHRvIGxvb2sgbW9yZSBjb25jcmV0ZWx5IGF0IHRoZSBxdWVzdGlvbiBvZiB3aGF0IGFuIGV2YW5nZWxpY2FsIENocmlzdGlhbiBpcy4gSW5zdGVhZCBvZiBkZWZpbmluZyB0aGUgdGVybSBieSB3aGF0IGFuIGV2YW5nZWxpY2FsIENocmlzdGlhbiBzaG91bGQgYmUsIEkgZXhhbWluZWQgdGhlIHF1ZXN0aW9uIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHdoYXQgQW1lcmljYW4gc2F5IGFib3V0IHRoZW1zZWx2ZXMuIFRoZSBiZXN0IGRhdGEgc291cmNlIGZvciB0aGlzIHF1ZXN0aW9uIGFyZSB0aGUgUGV3IHN1cnZleXMgb24gcmVsaWdpb24gYW5kIHBvbGl0aWNzLCB0aGUgbW9zdCByZWNlbnQgb2Ygd2hpY2ggd2FzIFtqdXN0IHJlbGVhc2VkXShodHRwOi8vd3d3LnBld2ZvcnVtLm9yZy9yZWxpZ2lvdXMtbGFuZHNjYXBlLXN0dWR5LykuIEFsdGhvdWdoIHRoZSBzdXJ2ZXkgZGF0ZXMgZnJvbSAyMDE0LCBpdCBpcyB0aGUgYmVzdCBhdmFpbGFibGUgZXZpZGVuY2UgYmVjYXVzZSBpdCB1c2VkIGEgdmVyeSBsYXJnZSBzYW1wbGUtLW92ZXIgMzAsMDAwIHJlc3BvbmRlbnRzLS1hbmQgY29udGFpbmVkIGEgYmF0dGVyeSBvZiBxdWVzdGlvbnMgY29uY2VybmluZyBib3RoIHJlbGlnaW91cyBhbmQgcG9saXRpY2FsIHZpZXdzLiBGb3IgdGhhdCByZWFzb24sIGl0IGlzIGlkZWFsIGZvciB1bmRlcnN0YW5kaW5nIHdoYXQgaXQgbWVhbnMgdG8gYmUgZXZhbmdlbGljYWwuCgpUaGVyZSBhcmUgZGlmZmVyZW50IHdheXMgb2Ygc2xpY2luZyBhbmQgZGljaW5nIHRoaXMgc3VydmV5LiBXZSBjb3VsZCwgZm9yIGV4YW1wbGUsIHRha2UgdGhlIHF1ZXN0aW9uIGZyb20gdGhlIHN1cnZleSB0aGF0IGFza3MgcGVvcGxlIGlmIHRoZXkgYXJlIGV2YW5nZWxpY2FsIENocmlzdGlhbnMsIGFuZCB0aGVuIHJlc3RyaWN0IG91ciBmb2N1cyB0byBvbmx5IHRoaXMgZ3JvdXAuIEhvd2V2ZXIsIHRoZSBldmFuZ2VsaWNhbCBsYWJlbCBoYXMgYmVlbiBzdHJldGNoZWQgYW5kIGNoYWxsZW5nZWQgYnkgc28gbWFueSBwZW9wbGUgdGhhdCBpdCBzZWVtcyBpdCBjYW4gZGVzY3JpYmUgcGVvcGxlIHdpdGggcmVtYXJrYWJseSBjb250cmFzdGluZyBiZWxpZWZzLiAKCkluc3RlYWQsIEkgdXNlZCBhIHN0YXRpc3RpY2FsIG1vZGVsXltJIHVzZWQgdGhlIFIgcGFja2FnZSBtaXJ0IHRvIGVzdGltYXRlIGEgMlBMIGl0ZW0tcmVzcG9uc2UgdGhlb3J5IG1vZGVsLiBUaGUgZnVsbCBjb2RlIGlzIGF2YWlsYWJsZSBpbiB0aGUgY29kZSBmb2xkZXIgb2Ygb3VyIHdlYnNpdGUncyBHaXRodWIgYXQgKGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9zYXVkaXdpbi9zYXVkaXdpbi5naXRodWIuaW8pLiBUaGUgbW9kZWwgaW5jbHVkZXMgc2FtcGxpbmcgd2VpZ2h0cyB0byBhY2NvdW50IGZvciB0aGUgc2FtcGxpbmcgZGVzaWduLl0gdG8gY29sbGFwc2UgdGhlIHN1cnZleSdzIHF1ZXN0aW9ucyBkb3duIHRvIHR3byBkaW1lbnNpb25zLiBJIGRpZG4ndCBrbm93IGFoZWFkIG9mIHRpbWUgd2hhdCBkaW1lbnNpb25zIHRoZXNlIHdvdWxkIGJlLCBhbHRob3VnaCBJIHN1c3BlY3RlZCB0aGF0IGl0IHdvdWxkIGNvbGxhcHNlIHRvIGEgbGVmdC1yaWdodCBwb2xpdGljYWwgc2NhbGUgYW5kIGEgY29uc2VydmF0aXZlLWxpYmVyYWwgdGhlb2xvZ3kgc2NhbGUuIFRoZSBkYXRhIGFuYWx5c2lzIGxhcmdlbHkgY29uZmlybXMgbXkgcHJpb3Igc3VzcGljaW9ucy4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSB0aHJlZSBxdWVzdGlvbnMgdGhhdCBiZXN0IGV4cGxhaW5lZCBlYWNoIG9mIHRoZSB0d28gZGltZW5zaW9uczoKCiAgICBEaW1lbnNpb24gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiAyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRG8geW91IGJlbGlldmUgaW4gR29kIG9yIGEgdW5pdmVyc2FsIHNwaXJpdD8gICAgICAgICAgRG8geW91IHByZWZlciBzbWFsbCBvciBiaWcgZ292ZXJubWVudD8KSG93IGltcG9ydGFudCBpcyByZWxpZ2lvbiBpbiB5b3VyIGxpZmU/ICAgICAgICAgICAgICAgRG9lcyBnb3Zlcm5tZW50IGFpZCB0byB0aGUgcG9vciBkbyBtb3JlIGhhcm0gdGhhbiBnb29kPwpJcyB0aGUgQmlibGUgdGhlIFdvcmQgb2YgR29kPyAgICAgICAgICAgICAgICAgICAgICAgICBBcmUgeW91IGNvbnNlcnZhdGl2ZS9tb2RlcmF0ZS9saWJlcmFsPwpTaG91bGQgaG9tb3NleHVhbGl0eSBiZSBhY2NlcHRlZCBieSBzb2NpZXR5PyAgICAgICAgICBTaG91bGQgaG9tb3NleHVhbGl0eSBiZSBhY2NlcHRlZCBieSBzb2NpZXR5PwoKSSBkZWNpZGVkIHRvIGxhYmVsIHRoZSBmaXJzdCBkaW1lbnNpb24gYXMgcmVsaWdpb3VzIGJlbGllZiBhbmQgdGhlIHNlY29uZCBkaW1lbnNpb24gYXMgcG9saXRpY2FsIG9waW5pb25zLiBUaGUgZmlyc3QgYXBwZWFycyB0byBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2VjdWxhci1saWJlcmFsIGFuZCBjb25zZXJ2YXRpdmUgcmVsaWdpb3VzIGJlbGllZnMsIHN1Y2ggYXMgd2hldGhlciBhIHBlcnNvbiBiZWxpZXZlcyBpbiBHb2QgYW5kIGJlbGlldmVzIHRoYXQgdGhlIEJpYmxlIGlzIHRoZSBXb3JkIG9mIEdvZC4gVGhlIHRvcCBxdWVzdGlvbiBmb3IgdGhlIHNlY29uZCBkaW1lbnNpb24gcmVmbGVjdHMgYSBmdW5kYW1lbnRhbCBkaXZpZGUgYmV0d2VlbiB0aGUgcG9saXRpY2FsIGxlZnQgYW5kIHRoZSBwb2xpdGljYWwgcmlnaHQ6IHRoZSBzaXplIG9mIGdvdmVybm1lbnQuIFNpbWlsYXJseSwgdGhlIHNlY29uZC1tb3N0IGRpdmlzaXZlIHBvbGl0aWNhbCBxdWVzdGlvbiBjb25jZXJucyBhIHBlcmVubmlhbCBkZWJhdGUgb3ZlciB0aGUgd2VsZmFyZSBzdGF0ZSBhbmQgd2hldGhlciB0aGUgZ292ZXJubWVudCBzaG91bGQgYmUgaW52b2x2ZWQuIFdoYXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSBpcyB0aGF0IHRoZSBxdWVzdGlvbiBhYm91dCBob21vc2V4dWFsaXR5IGRpc2NyaW1pbmF0ZXMgb24gKmJvdGgqIGRpbWVuc2lvbnMuIEtub3dpbmcgc29tZW9uZSdzIHZpZXdzIGFib3V0IGhvbW9zZXh1YWxpdHkgY29tbXVuaWNhdGVzIGluZm9ybWF0aW9uIGFib3V0IGJvdGggdGhlaXIgcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgYmVsaWVmcywgc28gd2Ugd2lsbCBjZXJ0YWlubHkgZXhhbWluZSB0aGlzIHF1ZXN0aW9uIHRvIHVuZGVyc3RhbmQgaG93IGl0IGZpdHMgaW4gdGhlIHBpY3R1cmUuCgpUaGUgcGxvdCBiZWxvdyBzaG93cyByZXNwb25kZW50cyBwbG90dGVkIGFsb25nIHRoZXNlIGRpbWVuc2lvbnMuIFdlIGNhbiBzZWUgZnJvbSB0aGUgZ2VuZXJhbCBzaGFwZSBvZiB0aGUgcG9pbnRzIHRoYXQgdGhlcmUgaXMgYW4gb2Jsb25nLCBNaWxreSBXYXkgZ2FsYXh5LXR5cGUgc2hhcGUuIFRoaXMgaXMgYmVjYXVzZSBwZW9wbGUgdGVuZCB0byBjbHVzdGVyIGluIHRoZSB0b3AgbGVmdCwgbGliZXJhbCByZWxpZ2lvbiBhbmQgbGliZXJhbCBwb2xpdGljcywgYW5kIG9uIHRoZSBib3R0b20gcmlnaHQsIHdoaWNoIGlzIGNvbnNlcnZhdGl2ZSByZWxpZ2lvbiBhbmQgY29uc2VydmF0aXZlIHBvbGl0aWNzLiBIb3dldmVyLCB0aGVyZSBhcmUgcGVvcGxlIHdobyBtaXggYW5kIG1hdGNoIHRoZXNlIGJlbGllZnMsIGFzIHRoZXkgZmFsbCBpbnRvIHRoZSBvdGhlciB0d28gY2VsbHMuIFBlb3BsZSB3aG8gYXJlIGF0IHRoZSBleGFjdCBjZW50ZXIgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGNsYXNzaWZ5IHVzaW5nIGVpdGhlciBkaW1lbnNpb24uIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjdXBjYWtlcyBpbiB0aGUgcG9wdWxhdGlvbjogdGhleSBkb24ndCBjb25mb3JtIHRvIG91ciBzaW1wbGlzdGljIGFuYWx5c2lzIG9mIHJlbGlnaW9uIGFuZCBwb2xpdGljcy4gQnV0IGZvciBhIGxhcmdlIG51bWJlciBvZiBBbWVyaWNhbnMsIHRoZXNlIHR3byBkaW1lbnNpb25zIGRvIHRlbGwgdXMgYSBsb3QuCgpgYGB7ciBmYWN0b3JfcGxvdCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CiNVc2Ugb25seSAxNTAwIHBvaW50cyBmb3IgYmV0dGVyIHBsb3R0aW5nCmEgPC0gbGlzdCgKICB4ID0gYygzLjMsLTMuNiwwLC0uMjUpLAogIHkgPSBjKDAsMCwyLjYsLTIuOCksCiAgdGV4dCA9IGMoJ0NvbnNlcnZhdGl2ZTxicj5SZWxpZ2lvbicsCiAgICAgICAgICAgJ0xpYmVyYWw8YnI+UmVsaWdpb24nLAogICAgICAgICAgICdMaWJlcmFsIFBvbGl0aWNzJywKICAgICAgICAgICAnQ29uc2VydmF0aXZlIFBvbGl0aWNzJyksCiAgeHJlZiA9ICd4JywKICB5cmVmID0gInkiLAogIHNob3dhcnJvdyA9IEZBTFNFLAogIGF4ID0gMCwKICBheSA9IDAKKQoKc2FtcGxlX3Njb3JlcyAlPD4lIG11dGF0ZShkYXRhX2xhYmVscz1wYXN0ZTAoJ1N0YXRlOiAnLGFzX2ZhY3RvcihEYXRhc2V0X1BldyRzdGF0ZSksJzxicj4nLCdBZ2U6ICcsZGF0YSRhZ2VyZWMsJzxicj5JbmNvbWU6ICcsZGF0YSRpbmNvbWUsJzxicj5FZHVjYXRpb246ICcsZGF0YSRlZHVjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb249YXNfZmFjdG9yKERhdGFzZXRfUGV3JGNyZWdpb24pKQoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscyxob3ZlcmluZm89J3RleHQnKSAlPiUgYWRkX21hcmtlcnMoKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSkgCmBgYAoKV2UgY2FuIHVzZSB0aGUgb3RoZXIgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXkgdG8gYW5hbHl6ZSBob3cgcGVvcGxlIGRpZmZlciBhbG9uZyB0aGVpciBkZW1vZ3JhcGhpYyBiYWNrZ3JvdW5kIGFuZCBwb2xpdGljYWwgb3BpbmlvbnMsIGluY2x1ZGluZyByZWxpZ2lvdXMgZGVub21pbmF0aW9ucywgYWdlLCBpbmNvbWUsIGdvdmVybm1lbnQgcG9saWNpZXMsIGFuZCB0aGVvbG9naWNhbCBwZXJzcGVjdGl2ZXMuCgpGaXJzdCBvZiBhbGwsIHdlIGNhbiBsb29rIGF0IHRoZSBsaXN0IG9mIHJlbGlnaW91cyBncm91cHMgdG8gc2VlIGhvdyB0aGV5IGFsbCBzdGFjayB1cCBhZ2FpbnN0IGVhY2ggb3RoZXIuIFdlIHVzZSBhIHF1ZXN0aW9uIGZyb20gdGhlIHN1cnZleSB0aGF0IHRyYWNrZWQgYSBjb25zaWRlcmFibGUgbnVtYmVyIG9mIHJlbGlnaW91cyBjYXRlZ29yaWVzIHNvIHRoYXQgd2UgY2FuIGxvb2sgYXQgZXZhbmdlbGljYWwgQ2hyaXN0aWFucyBjb21wYXJlZCBvdGhlcnMuIFdlIHBsb3QgZWFjaCBvZiB0aGVzZSBjYXRlZ29yaWVzIG9uIG91ciBjaGFydCB0byBzZWUgaG93IHRoZXkgc3RhbmQgcmVsYXRpdmUgdG8gYWxsIHRoZSByZXNwb25kZW50cy4gVGhlIGNoYXJ0IGJlbG93IHNob3dzIHRoZSBzY29yZXMgb24gdGhlIGZpcnN0IGRpbWVuc2lvbnMsIHJlbGlnaW91cyBiZWxpZWYsIGZvciBzZXZlcmFsIGRpZmZlcmVudCBkZW5vbWluYXRpb25zIGFuZCByZWxpZ2lvdXMgY2F0ZWdvcmllcy4gCgpgYGB7ciByZWx0cmFkZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCm9yZGluYWxfY29lZnMgPC0gYWxsX2NvZWZzW2l0ZW1fdHlwZXM9PSdncmFkZWQnIHwgaXRlbV90eXBlcz09JzJQTCddCm5vbWluYWxfY29lZnMgPC0gYWxsX2NvZWZzW2l0ZW1fdHlwZXM9PSdub21pbmFsJ10KIyBvcmRpbmFsX2NvZWZzIDwtIGxhcHBseShvcmRpbmFsX2NvZWZzLGZ1bmN0aW9uKHgpIHsKIyAgIHggPC0geFtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cih4LCdkaW1uYW1lcycpW1syXV0pXQojICAgcmV0dXJuKHgpfSkKCnJlbHRyYWRfc2xvcGUgPC0gIG5vbWluYWxfY29lZnMkUkVMVFJBRFtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihub21pbmFsX2NvZWZzJFJFTFRSQUQsJ2RpbW5hbWVzJylbWzJdXSldCnJlbHRyYWRfY29lZnMgPC0gbm9taW5hbF9jb2VmcyRSRUxUUkFEW2dyZXBsKHBhdHRlcm49J2FrWzAtOV0rJyx4PWF0dHIobm9taW5hbF9jb2VmcyRSRUxUUkFELCdkaW1uYW1lcycpW1syXV0pXQpyZWx0cmFkX2xhYmVscyA8LSBsZXZlbHMoZGF0YSRSRUxUUkFEKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRSRUxUUkFEKSldCnJlbHRyYWRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cmVsdHJhZF9zbG9wZVtbMV1dKnJlbHRyYWRfY29lZnNbcmVsdHJhZF9jb2VmcyE9MF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9cmVsdHJhZF9zbG9wZVtbMl1dKnJlbHRyYWRfY29lZnNbcmVsdHJhZF9jb2VmcyE9MF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1yZWx0cmFkX2xhYmVscykKcmVsdHJhZF9kYXRhICU+JSBwbG90X2x5KHR5cGU9J2JhcicseD1+ZGltMSx5PX5yZW9yZGVyKGxhYmVscyxkaW0xKSxvcmllbnRhdGlvbj0naCcsdGV4dD1+bGFiZWxzKSAlPiUgbGF5b3V0KHhheGlzPWxpc3QodGl0bGU9J1JlbGlnb3VzIEJlbGllZiAoQ29uc2VydmF0aXZlIHRvIExpYmVyYWwpJyksIHlheGlzPWxpc3QodGl0bGU9JycpLG1hcmdpbj1saXN0KGw9MTAwKSkKYGBgCgpUaGlzIHBsb3Qgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggY2F1dGlvbiBiZWNhdXNlIGl0IGlzIHVzaW5nIGEgbGltaXRlZCBudW1iZXIgb2YgcXVlc3Rpb25zIHRvIGRpZmZlcmVudGlhdGUgcmVzcG9uZGVudHMgYWxvbmcgYmFzaWMgYmVsaWVmcywgc3VjaCBhcyBiZWxpZWYgaW4gR29kIGFuZCB3aGV0aGVyIEdvZCdzIHdvcmQgaXMgaW5zcGlyZWQuIEhvd2V2ZXIsIGl0IGlzIHN0aWxsIGludGVyZXN0aW5nIHRoYXQgRXZhbmdlbGljYWwgUHJvdGVzdGFudHMgYXJlIGNsb3NlciB0byBNdXNsaW1zIHRoYW4gdGhleSBhcmUgdG8gTWFpbmxpbmUgUHJvdGVzdGFudHMgb3IgZXZlbiBKZXdpc2ggcGVvcGxlLiBUaGlzIGdyYXBoIGRvZXMgc2VlbSB0byBjYXB0dXJlIHNvbWUgaW50dWl0aXZlIGlkZWEgYWJvdXQgaG93IGNsb3NlIGFuZCBmYXIgZGlmZmVyZW50IHJlbGlnaW91cyBncm91cHMgYXJlLCBhdCBsZWFzdCB3aGVuIGl0IGNvbWVzIHRvIGJlbGllZiBpbiBHb2QgYW5kIHRoZSByZWxhdGl2ZSBwcm94aW1pdHkgYmV0d2VlbiByZWxpZ2lvdXMgZ3JvdXBzLiBBcyB0aGUgQ2F0aG9saWMgcGhpbG9zb3BoZXIgUGV0ZXIgS3JlZWZ0IG9uY2Ugam9rZWQsCgo+IEkgb2Z0ZW4gZmluZCBtb3JlIG11dHVhbCB1bmRlcnN0YW5kaW5nIGJldHdlZW4gbXlzZWxmIGFuZCBhIGZ1bmRhbWVudGFsaXN0IFNvdXRoZXJuIEJhcHRpc3Qgd2hvIHNpbmNlcmVseSBiZWxpZXZlcyBJIGFtIHdvcnNoaXBwaW5nIHRoZSBncmVhdCB3aG9yZSBvZiBCYWJ5bG9uIGFuZCBvbiBteSB3YXkgdG8gSGVsbCwgb3Igd2l0aCBhIE11c2xpbSB3aG8gdW5jb21wcm9taXNpbmdseSByZWplY3RzIG15IGJlbGllZiB0aGF0IENocmlzdCBpcyBMb3JkIGFzIHV0dGVyIHBhZ2FuIGJsYXNwaGVteSwgdGhhbiBJIGZpbmQgd2l0aCBzb21lIGFjdGl2ZSBDYXRob2xpYyBsYWl0eSwgbnVucywgZXNwZWNpYWxseSBleC1udW5zLCBwcmllc3RzIGFuZCBldmVuIGJpc2hvcHMhIAoKVGhlc2UgZGlmZmVyZW5jZXMgcmVmbGVjdCBhIG1vcmUgY3VsdHVyYWwgdW5kZXJzdGFuZGluZyBvZiBmYWl0aCB0aGFuIHRoZXkgZG8gZGVlcCBpc3N1ZXMgb2YgZG9jdHJpbmUuCgpOZXh0IHdlIGxvb2sgYXQgZGVtb2dyYXBoaWMgZmFjdG9ycy4gRmlyc3QsIGRvIHBlb3BsZSBvZiB2YXJ5aW5nIGluY29tZXMgdGVuZCB0byBjbHVzdGVyIGluIGNlcnRhaW4gY2F0ZWdvcmllcz8gVGhlIGNoYXJ0IGJlbG93IHNob3dzIHRoYXQgaW5jb21lIGRvZXMgbm90IHZhcnkgbXVjaCBhbG9uZyByZWxpZ2lvdXMgYmVsaWVmcyAodGhlIGhvcml6b250YWwgZGltZW5zaW9uKSwgYnV0IHJhdGhlciBtb3N0bHkgYWxvbmcgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbiwgcG9saXRpY2FsIG9waW5pb24uIEFnYWluLCB0aGlzIGZpbmRpbmcgaXMgbm90IHN1cnByaXNpbmcgZ2l2ZW4gaG93IHdlIGtub3cgdGhhdCB3ZWFsdGhpZXIgcGVvcGxlIGluIHRoZSBVbml0ZWQgU3RhdGVzIHRlbmQgdG8gYmUgbW9yZSBjb25zZXJ2YXRpdmUuIEl0IHNob3VsZCBiZSBub3RlZCB0b28sIHRoYXQgdGhlc2UgbGluZXMgYXJlIGp1c3QgZXN0aW1hdGVzLS1pdCBpcyBtb3N0IGxpa2VseSB0aGF0IHBlb3BsZSBpbiB0aGVzZSBpbmNvbWUgY2F0ZWdvcmllcyB3aWxsIGZhbGwgaW4gYmV0d2VlbiB0aGVzZSBsaW5lcywgYnV0IHlvdSBjYW4gZmluZCBwbGVudHkgb2YgcmVzcG9uZGVudHMgb24gdGhlIHBsb3QgdGhhdCBkb24ndCBmYWxsIGludG8gdGhlc2UgbmVhdCBidWNrZXRzLiBXaGF0IGl0IGRvZXMgdGVsbCB1cyBpcyB0aGF0LCByZWdhcmRsZXNzIG9mIGFueXRoaW5nIGVsc2UsIGluY2x1ZGluZyByZWxpZ2lvdXMgYmVsaWVmLCB3ZWFsdGhpZXIgcGVvcGxlIGFyZSBtb3JlIGNvbnNlcnZhdGl2ZS4gT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IGtub3cgd2hldGhlciBhIHdlYWx0aHkgcGVyc29uIGlzIG5lY2Vzc2FyaWx5IG1vcmUgb3IgbGVzcyBjb25zZXJ2YXRpdmUgd2hlbiBpdCBjb21lcyB0byByZWxpZ2lvbjogdGhlcmUgYXJlIGJvdGggY29uc2VydmF0aXZlIGFuZCBsaWJlcmFsIHdlYWx0aHkgcmVzcG9uZGVudHMuCgpgYGB7ciByZWdpb25zLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQppbmNvbWVfc2xvcGUgPC0gIG9yZGluYWxfY29lZnMkaW5jb21lW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkaW5jb21lLCdkaW1uYW1lcycpW1syXV0pXQppbmNvbWVfY29lZnMgPC0gb3JkaW5hbF9jb2VmcyRpbmNvbWVbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkaW5jb21lLCdkaW1uYW1lcycpW1syXV0pXQppbmNvbWVfbGFiZWxzIDwtIGxldmVscyhkYXRhJGluY29tZSlbMjpsZW5ndGgobGV2ZWxzKGRhdGEkaW5jb21lKSldCmRpbXMgPC0gc2FwcGx5KGluY29tZV9jb2VmcywgZnVuY3Rpb24oeCkgKC14KmluY29tZV9zbG9wZSkvKHNxcnQoc3VtKGluY29tZV9zbG9wZV4yKSkpKQppbmNvbWVfZGF0YSA8LSBjYWxjX3BvaW50cyhkaW1zPWRpbXMscmVjdGFuZ2xlX3Njb3JlcyA9IHJlY3RhbmdsZV9zY29yZXMsbGFiZWxzPWluY29tZV9sYWJlbHMpCiMgCiMgaW5jb21lX2RhdGEgPC0gYXNfZGF0YV9mcmFtZShjYWxjX3BvaW50cykKIyBuYW1lcyhpbmNvbWVfZGF0YSkgPC0gaW5jb21lX2xhYmVscwojIGluY29tZV9kYXRhJHhwb2ludHMgPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMCkKIyBpbmNvbWVfZGF0YSA8LSAgZ2F0aGVyKGluY29tZV9kYXRhLGNhdGVnb3JpZXMseXBvaW50cywteHBvaW50cykKdGV4dF9kYXRhIDwtIGRhdGFfZnJhbWUoZGltMT1kaW1zWzEsXSxkaW0yPWRpbXNbMixdLGxhYmVscz1pbmNvbWVfbGFiZWxzKQoKIHNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMpICU+JSBhZGRfbWFya2Vycyhob3ZlcmluZm89J3RleHQnLG5hbWU9J0FsbCBSZXNwb25kZW50cycsb3BhY2l0eT0wLjEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpKSAlPiUgYWRkX2xpbmVzKGRhdGE9aW5jb21lX2RhdGEseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0nSW5jb21lIENhdGVnb3JpZXMnKSAlPiUgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGEseD1+ZGltMSx5PX5kaW0yLHRleHQ9fmxhYmVscyxuYW1lPSdQb2ludCBMYWJlbHMnLHRleHRwb3NpdGlvbj0nYm90dG9tIHJpZ2h0JykKYGBgCgpOZXh0IHdlJ2xsIGxvb2sgYXQgZWR1Y2F0aW9uLiBUaGlzIGNoYXJ0IHNob3dzIHRoYXQgdGhlIGVmZmVjdCBlZHVjYXRpb24gaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSBpbmNvbWUtLXdoaWxlIGluY29tZSB0ZWxscyB1cyBob3cgcG9saXRpY2FsbHkgY29uc2VydmF0aXZlIG9yIGxpYmVyYWwgc29tZW9uZSBpcywgZWR1Y2F0aW9uIGlzIG11Y2ggbW9yZSBsaWtlbHkgdG8gdGVsbCB1cyBob3cgY29uc2VydmF0aXZlIG9yIGxpYmVyYWwgdGhlaXIgcmVsaWdpb24gaXMuIFRoZXJlIGFyZSBwZW9wbGUgd2hvIGFyZSBwb2xpdGljYWxseSBjb25zZXJ2YXRpdmUgd2hvIGFyZSB3ZWxsLWVkdWNhdGVkLCBidXQgYXQgdGhlIHNhbWUgdGltZSB0aGVzZSBzYW1lIHBlb3BsZSBhbHNvIHRlbmQgdG8gYmUgbW9yZSBsaWJlcmFsIGluIHRlcm1zIG9mIHRoZWlyIGJlbGllZnMuCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0KZWR1Y19zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRlZHVjW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkZWR1YywnZGltbmFtZXMnKVtbMl1dKV0KZWR1Y19jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJGVkdWNbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkZWR1YywnZGltbmFtZXMnKVtbMl1dKV0KZWR1Y19sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkZWR1YylbMjpsZW5ndGgobGV2ZWxzKGRhdGEkZWR1YykpXQpkaW1zIDwtIHNhcHBseShlZHVjX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqZWR1Y19zbG9wZSkvKHNxcnQoc3VtKGVkdWNfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKZWR1Y19kYXRhIDwtIGFzX2RhdGFfZnJhbWUoY2FsY19wb2ludHMpCm5hbWVzKGVkdWNfZGF0YSkgPC0gZWR1Y19sYWJlbHMKZWR1Y19kYXRhJHlwb2ludHMgPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMCkKZWR1Y19kYXRhIDwtICBnYXRoZXIoZWR1Y19kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChlZHVjX2xhYmVscykpCnBsb3RfdGV4dCA8LSBzYXBwbHkoMTpsZW5ndGgoZWR1Y19sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9ZWR1Y19sYWJlbHMpCgoKIHNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMpICU+JSBhZGRfbWFya2Vycyhob3ZlcmluZm89J3RleHQnLG5hbWU9J0FsbCBSZXNwb25kZW50cycsb3BhY2l0eT0wLjEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSkgJT4lIGFkZF9saW5lcyhkYXRhPWVkdWNfZGF0YSx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdFZHVjYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIAoKYGBgCgpHaXZlbiB0aGVzZSB0d28gZGlmZmVyaW5nIGVmZmVjdHMgb2YgaW5jb21lIGFuZCBlZHVjYXRpb24sIHdlIGNhbiBsZWFybiBzb21ldGhpbmcgYnkgcHV0dGluZyB0aGUgbGluZXMgb250byB0aGUgc2FtZSBwbG90LCBtYWtpbmcgY3Jvc3MtaGF0Y2guIChZZXMsIHdlIGFyZSBsaXRlcmFsbHkgcHV0dGluZyBwZW9wbGUgaW4gYm94ZXMpLiBOb3cgd2UgaGF2ZSBhIGJ1bmNoIG9mIHBpY2stdXAgc3RpY2tzIGxhaWQgb24gdG9wIG9mIG91ciBjaGFydC4gV2hpbGUgaXQgaXMgYSBiaXQgdG9vIG11Y2ggdG8gYWJzb3JiLCBpdCBzaG93cyBob3cgaW5jb21lIGFuZCBlZHVjYXRpb24gaGF2ZSBhIGNvbXBsaWNhdGVkIGludGVyYWN0aW9uIHdoZW4gaXQgY29tZXMgdG8gcGVvcGxlJ3MgcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgYmVsaWVmcy4gVG8gZ2l2ZSBqdXN0IG9uZSBpbnRlcmVzdGluZyBpbnRlcnByZXRhdGlvbiwgdGhlcmUgaXMgYSBiaWcgYm94IG9mIHBlb3BsZSB3aG8gaGF2ZSBhIHZlcnkgaGlnaCBpbmNvbWUgKG1vcmUgdGhhbiAkMTUwSykgYnV0IGxvdyBlZHVjYXRpb24gKGhpZ2ggc2Nob29sIG9yIGxlc3MpLiBUaGVzZSBwZW9wbGUgdGVuZCB0byBoYXZlIHZlcnkgY29uc2VydmF0aXZlIHBvbGl0aWNzIGJ1dCB0aGVpciByZWxpZ2lvdXMgYmVsaWVmcyBhcmUgbW9yZSBjb25zZXJ2YXRpdmUuIE9uIHRoZSBmbGlwIHNpZGUsIHRoZSBib3ggd2l0aCBwZW9wbGUgd2l0aCBoaWdoIGluY29tZSBhbmQgaGlnaCBlZHVjYXRpb24gc2hvd3MgdGhhdCB0aGV5IGFyZSBtb3JlIGxpYmVyYWwgcG9saXRpY2FsbHksIGFsdGhvdWdoIHRoZXkgYWxzbyBoYXZlIG1vcmUgY29uc2VydmF0aXZlIGJlbGllZnMuIEluIG90aGVyIHdvcmRzLCBwZW9wbGUgYXJlIGNvbXBsaWNhdGVkLCBhbmQgd2UgY2FuJ3QgYWx3YXlzIGtub3cgcGVvcGxlJ3MgYmVsaWVmcyBqdXN0IGJ5IGtub3dpbmcgb25seSB0aGVpciBlZHVjYXRpb24gb3IgaW5jb21lLgoKYGBge3IsZWNobz1GQUxTRSwgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiBzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4xKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSkgJT4lIGFkZF9saW5lcyhkYXRhPWluY29tZV9kYXRhLHk9fnlwb2ludHMseD1+eHBvaW50cyxsaW5ldHlwZT1+Y2F0ZWdvcmllcyxpbmhlcml0PUZBTFNFLG5hbWU9J0luY29tZSBDYXRlZ29yaWVzJyx0ZXh0PX5jYXRlZ29yaWVzKSAlPiUgYWRkX2xpbmVzKGRhdGE9ZWR1Y19kYXRhLHk9fnlwb2ludHMseD1+eHBvaW50cyxjb2xvcj1+Y2F0ZWdvcmllcyxpbmhlcml0PUZBTFNFLG5hbWU9J0VkdWNhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1+Y2F0ZWdvcmllcykgCmBgYAoKTm93IHdlJ3JlIGdvaW5nIHRvIGRpZyBkZWVwIGludG8gaG93IHBlb3BsZSBpZGVudGlmeSBpbiB0ZXJtcyBvZiByZWxpZ2lvbiBhbmQgd2hhdCB0aGF0IHNheXMgYWJvdXQgdGhlaXIgcG9saXRpY3MuIEZpcnN0LCB3ZSdsbCBsb29rIGF0IHJlc3BvbnNlcyB0byB0aGUgcXVlc3Rpb24sICJIb3cgb2Z0ZW4gZG8geW91IHNoYXJlIHlvdXIgZmFpdGggd2l0aCBub24tYmVsaWV2ZXJzIG9yIHBlb3BsZSBmcm9tIG90aGVyIHJlbGlnaW91cyBiYWNrZ3JvdW5kcz8iIFdlIHNlZSB0aGF0IHRoaXMgcXVlc3Rpb24gZ2VuZXJhbGx5IGNvcnJlc3BvbmRzIHRvIHdoYXQgd2Uga25vdyBvZiByZWxpZ2lvdXMgYmVsaWVmOiB0aG9zZSB3aG8gc2hhcmUgdGhlaXIgZmFpdGggIm9uY2Ugb3IgdHdpY2UgYSBtb250aCBvciBtb3JlIiB0ZW5kIHRvIGFsc28gaGF2ZSBtb3JlIGNvbnNlcnZhdGl2ZSBiZWxpZWZzLiBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgYSBzbGlnaHQgbGVmdHdhcmQgdGlsdCB0byB0aGUgbGluZXMsIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBwZW9wbGUgYWxzbyB0ZW5kIHRvIGJlIG1vcmUgKmxpYmVyYWwqIHBvbGl0aWNhbGx5LiBJdCdzIG5vdCBhIHZlcnkgc3Ryb25nIHJlbGF0aW9uc2hpcCwgYnV0IGl0IGlzIHRoZXJlLCBhbmQgaXQgaXMgcXVpdGUgaW50ZXJlc3RpbmcuIEVzc2VudGlhbGx5LCBpdCBtZWFucyB0aGF0IHBlb3BsZSB3aG8gc2hhcmUgdGhlaXIgZmFpdGggYSBsb3QgYXJlIGluIGdlbmVyYWwgbW9yZSBjb25zZXJ2YXRpdmUgaW4gdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMuIEJ1dCB3aGVuIHdlIGxvb2sgYXQgcGVvcGxlIHdobyBhcmUgZXF1YWxseSBjb25zZXJ2YXRpdmUgaW4gcmVsaWdpb3VzIGJlbGllZiwgdGhvc2Ugd2hvIHNoYXJlIHRoZWlyIGZhaXRoIG1vcmUgYXJlIGFsc28gc29tZXdoYXQgbW9yZSBsaWJlcmFsIChvciBtb2RlcmF0ZSkgcG9saXRpY2FsbHkuCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNoYXJlX3Nsb3BlIDwtICBvcmRpbmFsX2NvZWZzJHFpMmdbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaTJnLCdkaW1uYW1lcycpW1syXV0pXQpzaGFyZV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFpMmdbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkcWkyZywnZGltbmFtZXMnKVtbMl1dKV0Kc2hhcmVfbGFiZWxzIDwtIGxldmVscyhkYXRhJHFpMmcpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFpMmcpKV0KZGltcyA8LSBzYXBwbHkoc2hhcmVfY29lZnMsIGZ1bmN0aW9uKHgpICgteCpzaGFyZV9zbG9wZSkvKHNxcnQoc3VtKHNoYXJlX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcykKCnNoYXJlX2RhdGEgPC0gYXNfZGF0YV9mcmFtZShjYWxjX3BvaW50cykKbmFtZXMoc2hhcmVfZGF0YSkgPC0gc2hhcmVfbGFiZWxzCnNoYXJlX2RhdGEkeXBvaW50cyA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKQpzaGFyZV9kYXRhIDwtICBnYXRoZXIoc2hhcmVfZGF0YSxjYXRlZ29yaWVzLHhwb2ludHMsLXlwb2ludHMpCnRvX2Nob29zZSA8LSBmbG9vcihucm93KGNhbGNfcG9pbnRzKS9sZW5ndGgoc2hhcmVfbGFiZWxzKSkKcGxvdF90ZXh0IDwtIHNhcHBseSgxOmxlbmd0aChzaGFyZV9sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9c2hhcmVfbGFiZWxzKQoKCnNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMpICU+JSBhZGRfbWFya2Vycyhob3ZlcmluZm89J3RleHQnLG5hbWU9J0FsbCBSZXNwb25kZW50cycsb3BhY2l0eT0wLjEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpKSAlPiUgYWRkX2xpbmVzKGRhdGE9c2hhcmVfZGF0YSx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdzaGFyZWF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIApgYGAKQW5vdGhlciBpbXBvcnRhbnQgcGFydCBvZiBmYWl0aCBpcyBwcmF5aW5nLiBUaGUgY2hhcnQgYmVsb3cgc2hvd3MgdGhlIHByZWRpY3RlZCBsaW5lcyBmb3IgYSBxdWVzdGlvbiB0aGF0IGFza3MgcmVzcG9uZGVudHMgaG93IG9mdGVuIHRoZXkgcHJheS4gQWdhaW4sIHdlIHNlZSB0aGF0IHByYXlpbmcgaXMgYSBnb29kIGluZGljYXRvciBvZiB3aGV0aGVyIHNvbWVvbmUgaXMgbW9yZSBjb25zZXJ2YXRpdmUgcmVsaWdpb3VzbHkuIFdlIGFsc28gc2VlIHRoZSBzYW1lLCBldmVuIHNsaWdodGVyLCBsZWZ0d2FyZCB0aWx0LCBpbXBseWluZyB0aGF0IHJlZ2FyZGxlc3Mgb2YgYmVsaWVmLCBwZW9wbGUgd2hvIHByYXkgYSBsb3Qgd2lsbCB0aWx0IChldmVyIHNvIHNsaWdodGx5KSBsaWJlcmFsIHBvbGl0aWNhbGx5LgoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcWkxX3Nsb3BlIDwtICBvcmRpbmFsX2NvZWZzJHFpMVtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFpMSwnZGltbmFtZXMnKVtbMl1dKV0KcWkxX2NvZWZzIDwtIG9yZGluYWxfY29lZnMkcWkxW2dyZXBsKHBhdHRlcm49J2RbMC05XSsnLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFpMSwnZGltbmFtZXMnKVtbMl1dKV0KcWkxX2xhYmVscyA8LSBsZXZlbHMoZGF0YSRxaTEpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFpMSkpXQpkaW1zIDwtIHNhcHBseShxaTFfY29lZnMsIGZ1bmN0aW9uKHgpICgteCpxaTFfc2xvcGUpLyhzcXJ0KHN1bShxaTFfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKcWkxX2RhdGEgPC0gYXNfZGF0YV9mcmFtZShjYWxjX3BvaW50cykKbmFtZXMocWkxX2RhdGEpIDwtIHFpMV9sYWJlbHMKcWkxX2RhdGEkeXBvaW50cyA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKQpxaTFfZGF0YSA8LSAgZ2F0aGVyKHFpMV9kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChxaTFfbGFiZWxzKSkKcGxvdF90ZXh0IDwtIHNhcHBseSgxOmxlbmd0aChxaTFfbGFiZWxzKSxmdW5jdGlvbih4KSB7CiAgeSA8LSBjYWxjX3BvaW50c1sseF1bKHgqMTQpLTEzXQogIHggPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMClbKHgqMTQpLTEzXQogIHJldHVybihjKHgseSkpCn0pCgp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPXBsb3RfdGV4dFsyLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9cGxvdF90ZXh0WzEsXSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXFpMV9sYWJlbHMpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpICU+JSBhZGRfbGluZXMoZGF0YT1xaTFfZGF0YSx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdxaTFhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAKYGBgCkZpbmFsbHksIGxldCdzIGxvb2sgYXQgaG93IG9mdGVuIHBlb3BsZSBhdHRlbmQgY2h1cmNoIChvciBwbGFjZSBvZiB3b3JzaGlwKSwgd2hpY2ggaXMgYWxzbyBhIGNvcmUgY29tcG9uZW50IG9mIGFsbCByZWxpZ2lvbnMuIFRoZXNlIGxpbmVzIHNob3cgYW4gZXZlbiBtb3JlIHByb25vdW5jZWQgbGVmdHdhcmQgdGlsdC4gVGhpcyBjaGFydCBtZWFucyB0aGF0IHBlb3BsZSB3aG8gYXR0ZW5kIGNodXJjaCBhcmUgbXVjaCBtb3JlIGxpa2VseSB0byBiZSBtb3JlIGNvbnNlcnZhdGl2ZSBpbiB0aGVpciByZWxpZ2lvdXMgYmVsaWVmcywgYnV0IGF0IHRoZSBzYW1lIHRpbWUgdGhlaXIgcG9saXRpY2FsIG9waW5pb25zIGFyZSBqdXN0IGEgYml0IG1vcmUgbGliZXJhbCB0aGFuIGZlbGxvdyBiZWxpZXZlcnMgd2hvIGRvbid0IGF0dGVuZCBjaHVyY2guCgpgYGB7cixlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphdHRlbmRfc2xvcGUgPC0gIG9yZGluYWxfY29lZnMkYXR0ZW5kW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkYXR0ZW5kLCdkaW1uYW1lcycpW1syXV0pXQphdHRlbmRfY29lZnMgPC0gb3JkaW5hbF9jb2VmcyRhdHRlbmRbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkYXR0ZW5kLCdkaW1uYW1lcycpW1syXV0pXQphdHRlbmRfbGFiZWxzIDwtIGxldmVscyhkYXRhJGF0dGVuZClbMjpsZW5ndGgobGV2ZWxzKGRhdGEkYXR0ZW5kKSldCmRpbXMgPC0gc2FwcGx5KGF0dGVuZF9jb2VmcywgZnVuY3Rpb24oeCkgKC14KmF0dGVuZF9zbG9wZSkvKHNxcnQoc3VtKGF0dGVuZF9zbG9wZV4yKSkpKQoKYWxsX3BvaW50cyA8LSBjYWxjX3BvaW50cyhkaW1zPWRpbXMscmVjdGFuZ2xlX3Njb3JlcyA9IHJlY3RhbmdsZV9zY29yZXMpCgphdHRlbmRfZGF0YSA8LSBhc19kYXRhX2ZyYW1lKGNhbGNfcG9pbnRzKQpuYW1lcyhhdHRlbmRfZGF0YSkgPC0gYXR0ZW5kX2xhYmVscwphdHRlbmRfZGF0YSR5cG9pbnRzIDwtIHNlcShmcm9tPS0yLHRvPTIsbGVuZ3RoLm91dD0xMDApCmF0dGVuZF9kYXRhIDwtICBnYXRoZXIoYXR0ZW5kX2RhdGEsY2F0ZWdvcmllcyx4cG9pbnRzLC15cG9pbnRzKQp0b19jaG9vc2UgPC0gZmxvb3IobnJvdyhjYWxjX3BvaW50cykvbGVuZ3RoKGF0dGVuZF9sYWJlbHMpKQpwbG90X3RleHQgPC0gc2FwcGx5KDE6bGVuZ3RoKGF0dGVuZF9sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YXR0ZW5kX2xhYmVscykKCgpzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4xKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSkgJT4lIGFkZF9saW5lcyhkYXRhPWF0dGVuZF9kYXRhLHk9fnlwb2ludHMseD1+eHBvaW50cyxjb2xvcj1+Y2F0ZWdvcmllcyxpbmhlcml0PUZBTFNFLG5hbWU9J2F0dGVuZGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIApgYGAKTm93IHRoYXQgd2UndmUgZGlhZ25vc2VkIHRoZSB2ZXJ5IGludGVyZXN0aW5nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHJlbGlnaW91cyBiZWxpZWYgYW5kIHJlbGlnaW91cyBwcmFjdGljZSwgd2UgY2FuIGxvb2sgYXQgZGl2aXNpdmUgcG9saXRpY2FsIGFuZCByZWxpZ2lvdXMgcXVlc3Rpb25zIHRoYXQgd2VyZSBhc2tlZCByZXNwb25kZW50cy4gRmlyc3QsIHdlJ2xsIHVzZSBhIHF1ZXN0aW9uIHRoYXQgbWVhc3VyZXMgdGhlIGV4Y2x1c2l2aXR5IG9mIHBlb3BsZSdzIHJlbGlnaW91cyBjb21taXRtZW50cy4gVGhpcyBxdWVzdGlvbiBhc2tlZCwgImlzIHlvdXIgcmVsaWdpb24gdGhlIG9uZSwgdHJ1ZSBmYWl0aCBsZWFkaW5nIHRvIGV0ZXJuYWwgbGlmZSwgb3IgY2FuIG1hbnkgcmVsaWdpb25zIGxlYWQgdG8gZXRlcm5hbCBsaWZlPyIgV2Ugb25seSBwdXQgb25lIGxpbmUgb24gdGhlIGNoYXJ0IGJlbG93IGJlY2F1c2UgdGhpcyBpcyBhIHNpbXBsZSB5ZXMvbm8gcXVlc3Rpb24uIFRob3NlIHRvIHRoZSByaWdodCBvZiB0aGUgbGluZSBzYWlkIHRoYXQgdGhlaXIgcmVsaWdpb24gaXMgZXhjbHVzaXZlLCB3aGlsZSB0aG9zZSB0byB0aGUgbGVmdCBzYWlkIHRoYXQgbWFueSByZWxpZ2lvbnMgY2FuIGxlYWQgdG8gZXRlcm5hbCBsaWZlLiBUaGlzIHF1ZXN0aW9uIGRvZXMgbm90IHRlbGwgdXMgbXVjaCwgaWYgYW55dGhpbmcsIGFib3V0IHNvbWVvbmUncyBwb2xpdGljYWwgdmlld3MsIGJ1dCBpdCBkb2VzIGNsZWFybHkgZGVsaW5lYXRlIHRob3NlIHdobyBhcmUgdmVyeSBjb25zZXJ2YXRpdmUgaW4gdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMgZnJvbSB0aG9zZSB3aG8gYXJlbid0LgoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcWgxX3Nsb3BlIDwtICBvcmRpbmFsX2NvZWZzJHFoMVtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFoMSwnZGltbmFtZXMnKVtbMl1dKV0KcWgxX2NvZWZzIDwtIG9yZGluYWxfY29lZnMkcWgxW2dyZXBsKHBhdHRlcm49J2QnLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFoMSwnZGltbmFtZXMnKVtbMl1dKV0KcWgxX2xhYmVscyA8LSBsZXZlbHMoZGF0YSRxaDEpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFoMSkpXQpkaW1zIDwtIHNhcHBseShxaDFfY29lZnMsIGZ1bmN0aW9uKHgpICgteCpxaDFfc2xvcGUpLyhzcXJ0KHN1bShxaDFfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKcWgxX2RhdGEgPC0gYXNfZGF0YV9mcmFtZShjYWxjX3BvaW50cykKbmFtZXMocWgxX2RhdGEpIDwtIHFoMV9sYWJlbHMKcWgxX2RhdGEkeXBvaW50cyA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKQpxaDFfZGF0YSA8LSAgZ2F0aGVyKHFoMV9kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChxaDFfbGFiZWxzKSkKcGxvdF90ZXh0IDwtIHNhcHBseSgxOmxlbmd0aChxaDFfbGFiZWxzKSxmdW5jdGlvbih4KSB7CiAgeSA8LSBjYWxjX3BvaW50c1sseF1bKHgqMTQpLTEzXQogIHggPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMClbKHgqMTQpLTEzXQogIHJldHVybihjKHgseSkpCn0pCgp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPXBsb3RfdGV4dFsyLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9cGxvdF90ZXh0WzEsXSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXFoMV9sYWJlbHMpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpICU+JSBhZGRfbGluZXMoZGF0YT1xaDFfZGF0YSx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdxaDFhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAKYGBgCgpXZSBmaXJzdCBsb29rIGF0IHRoZSBxdWVzdGlvbiBvbiBob21vc2V4dWFsaXR5LCB3aGljaCB3ZSBrbm93IGlzIHZlcnkgZGl2aXNpdmUgb24gYm90aCBkaW1lbnNpb25zLiBUaGlzIHF1ZXN0aW9uIGFza2VkIHJlc3BvbmRlbnRzLCAic2hvdWxkIGhvbW9zZXh1YWxpdHkgYmUgZGlzY291cmFnZWQgYnkgc29jaWV0eT8iIFVubGlrZSByZWxpZ2lvdXMgcHJhY3RpY2UsIHRoaXMgcXVlc3Rpb24gaGFzIGEgc3Ryb25nIHJpZ2h0d2FyZCB0aWx0LiBUaGlzIG1lYW5zIHRoYXQgdGhvc2Ugd2hvIHRoaW5rIGhvbW9zZXh1YWxpdHkgc2hvdWxkIGJlIGRpc2NvdXJhZ2VkIGFyZSBtb3JlIGxpa2VseSB0byBiZSBjb25zZXJ2YXRpdmUgcG9saXRpY2FsbHkgYW5kIHJlbGlnaW91c2x5LiBUaGlzIHF1ZXN0aW9uIHdvdWxkIGFwcGVhciB0byBleGVtcGxpZnkgdGhlIGRpdmlkZSBiZXR3ZWVuIHRoZSBncm91cHMgdGhhdCBtYXRjaCBjb25zZXJ2YXRpdmUgcmVsaWdpb3VzIGJlbGllZnMgdG8gY29uc2VydmF0aXZlIHBvbGl0aWNzIGFuZCB2aWNlIHZlcnNhLgoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcWIyYV9zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRxYjJhW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYSwnZGltbmFtZXMnKVtbMl1dKV0KcWIyYV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFiMmFbZ3JlcGwocGF0dGVybj0nZCcseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYSwnZGltbmFtZXMnKVtbMl1dKV0KcWIyYV9sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkcWIyYSlbMjpsZW5ndGgobGV2ZWxzKGRhdGEkcWIyYSkpXQpkaW1zIDwtIHNhcHBseShxYjJhX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqcWIyYV9zbG9wZSkvKHNxcnQoc3VtKHFiMmFfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKcWIyYV9kYXRhIDwtIGFzX2RhdGFfZnJhbWUoY2FsY19wb2ludHMpCm5hbWVzKHFiMmFfZGF0YSkgPC0gcWIyYV9sYWJlbHMKcWIyYV9kYXRhJHlwb2ludHMgPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMCkKcWIyYV9kYXRhIDwtICBnYXRoZXIocWIyYV9kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChxYjJhX2xhYmVscykpCnBsb3RfdGV4dCA8LSBzYXBwbHkoMTpsZW5ndGgocWIyYV9sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cWIyYV9sYWJlbHMpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpICU+JSBhZGRfbGluZXMoZGF0YT1xYjJhX2RhdGEseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0ncWIyYWF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIApgYGAKCldoaWxlIGhvbW9zZXh1YWxpdHkgaXMgYSBzb2NpYWwgcXVlc3Rpb24gd2l0aCBjbGVhciByZWxpZ2lvdXMgYW5kIHBvbGl0aWNhbCBjb25ub3RhdGlvbnMsIHdlIGNhbiBsb29rIGF0IHdoZXRoZXIgb3RoZXIgcG9saXRpY2FsIHF1ZXN0aW9ucyBhcmUgc2ltaWxhcmx5IGRpdmlzaXZlIGFsb25nIHJlbGlnaW91cyBsaW5lcy4gVGhlIHF1ZXN0aW9uIGJlbG93IGFza3MgcmVzcG9uZGVudHMgd2hldGhlciB0aGV5IHRoaW5rIGdvdmVybm1lbnQgYWlkIHRvIHRoZSBwb29yIGRvZXMgbW9yZSBoYXJtIHRoYW4gZ29vZC4gVGhlIHNsYW50IG9uIHRoaXMgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBxdWVzdGlvbiBvbiBob21vc2V4dWFsaXR5LCB0aG91Z2ggbm90IGFzIHN0ZWVwLiBQZW9wbGUgd2hvIGJlbGlldmUgdGhhdCB0aGUgZ292ZXJubWVudCBhaWQgdG8gdGhlIHBvb3IgaGFybXMgdGhlIHBvb3IgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGNvbnNlcnZhdGl2ZSByZWxpZ2lvdXNseSBhbmQgcG9saXRpY2FsbHksIGFsdGhvdWdoIHRoZSByZWxhdGlvbnNoaXAgd2l0aCByZWxpZ2lvbiBpcyBtdWNoIHdlYWtlci4gSXQgaXMgYWxzbyBpbnRlcmVzdGluZyB0aGF0IHRoaXMgbGluZSBnb2VzIHN0cmFpZ2h0IHRocm91Z2ggdGhlIG1pZGRsZSBvZiB0aGUgY2hhcnQuIFRob3NlIHdobyBhcmVuJ3Qgc3VyZSBhYm91dCB3aGV0aGVyIGFpZCBkb2VzIG1vcmUgaGFybSBvciBnb29kIGFyZSBhbHNvIHRob3NlIHdobyBhcmUgcG9saXRpY2FsbHkgbW9kZXJhdGVzLgoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcWIyYl9zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRxYjJiW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYiwnZGltbmFtZXMnKVtbMl1dKV0KcWIyYl9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFiMmJbZ3JlcGwocGF0dGVybj0nZCcseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYiwnZGltbmFtZXMnKVtbMl1dKV0KcWIyYl9sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkcWIyYilbMjpsZW5ndGgobGV2ZWxzKGRhdGEkcWIyYikpXQpkaW1zIDwtIHNhcHBseShxYjJiX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqcWIyYl9zbG9wZSkvKHNxcnQoc3VtKHFiMmJfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKcWIyYl9kYXRhIDwtIGFzX2RhdGFfZnJhbWUoY2FsY19wb2ludHMpCm5hbWVzKHFiMmJfZGF0YSkgPC0gcWIyYl9sYWJlbHMKcWIyYl9kYXRhJHlwb2ludHMgPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMCkKcWIyYl9kYXRhIDwtICBnYXRoZXIocWIyYl9kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChxYjJiX2xhYmVscykpCnBsb3RfdGV4dCA8LSBzYXBwbHkoMTpsZW5ndGgocWIyYl9sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cWIyYl9sYWJlbHMpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpICU+JSBhZGRfbGluZXMoZGF0YT1xYjJiX2RhdGEseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0ncWIyYmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIApgYGAKCk5leHQgd2UnbGwgZXhhbWluZSBlbnZpcm9ubWVudGFsIHBvbGljeS4gVGhpcyBxdWVzdGlvbiBhc2tlZCByZXNwb25kZW50cyB3aGV0aGVyIHN0cmljdGVyIGVudmlyb25tZW50YWwgcmVndWxhdGlvbnMgYXJlIHdvcnRoIHRoZSBhZGRlZCBjb3N0LiBUaGlzIHF1ZXN0aW9uIGFsc28gYnJlYWtzIGRvd24gYWxvbmcgYm90aCByZWxpZ2lvdXMgYW5kIHBvbGl0aWNhbCBsaW5lczogcGVvcGxlIHdobyB0aGluayBlbnZpcm9ubWVudGFsIHJlZ3VsYXRpb25zIGFyZSBtb3JlIGltcG9ydGFudCB0ZW5kIHRvIGJlIG1vcmUgbGliZXJhbCBwb2xpdGljYWxseSBhbmQgcmVsaWdvdXNseSwgYWx0aG91Z2ggdGhlIGVmZmVjdCBpcyBzdHJvbmdlciBmb3IgdGhlaXIgcG9saXRpY2FsIGlkZW9sb2d5IHRoYW4gZm9yIHJlbGlnaW9uLgoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcWIyY19zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRxYjJjW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYywnZGltbmFtZXMnKVtbMl1dKV0KcWIyY19jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFiMmNbZ3JlcGwocGF0dGVybj0nZCcseD1hdHRyKG9yZGluYWxfY29lZnMkcWIyYywnZGltbmFtZXMnKVtbMl1dKV0KcWIyY19sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkcWIyYylbMjpsZW5ndGgobGV2ZWxzKGRhdGEkcWIyYykpXQpkaW1zIDwtIHNhcHBseShxYjJjX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqcWIyY19zbG9wZSkvKHNxcnQoc3VtKHFiMmNfc2xvcGVeMikpKSkKCmFsbF9wb2ludHMgPC0gY2FsY19wb2ludHMoZGltcz1kaW1zLHJlY3RhbmdsZV9zY29yZXMgPSByZWN0YW5nbGVfc2NvcmVzKQoKcWIyY19kYXRhIDwtIGFzX2RhdGFfZnJhbWUoY2FsY19wb2ludHMpCm5hbWVzKHFiMmNfZGF0YSkgPC0gcWIyY19sYWJlbHMKcWIyY19kYXRhJHlwb2ludHMgPC0gc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PTEwMCkKcWIyY19kYXRhIDwtICBnYXRoZXIocWIyY19kYXRhLGNhdGVnb3JpZXMseHBvaW50cywteXBvaW50cykKdG9fY2hvb3NlIDwtIGZsb29yKG5yb3coY2FsY19wb2ludHMpL2xlbmd0aChxYjJjX2xhYmVscykpCnBsb3RfdGV4dCA8LSBzYXBwbHkoMTpsZW5ndGgocWIyY19sYWJlbHMpLGZ1bmN0aW9uKHgpIHsKICB5IDwtIGNhbGNfcG9pbnRzWyx4XVsoeCoxNCktMTNdCiAgeCA8LSBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9MTAwKVsoeCoxNCktMTNdCiAgcmV0dXJuKGMoeCx5KSkKfSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9cGxvdF90ZXh0WzIsXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1wbG90X3RleHRbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cWIyY19sYWJlbHMpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpICU+JSBhZGRfbGluZXMoZGF0YT1xYjJjX2RhdGEseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0ncWIyY2F0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpIApgYGAKCkJhc2VkIG9uIG91ciBhbmFseXNpcyBzbyBmYXIsIHdlIGtub3cgdGhhdCBjb3JlIHBvbGl0aWNhbCBxdWVzdGlvbnMsIHN1Y2ggYXMgd2VsZmFyZSwgZW52aXJvbm1lbnRhbCByZWd1bGF0aW9ucywgYW5kIGhvbW9zZXh1YWxpdHkgY2FuIGFsbCBkaXZpZGUgcGVvcGxlIG9uIGJvdGggcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgZ3JvdW5kcy4gVGhlIHN0cm9uZ2VzdCBkaXZpZGUgaXMgb24gaG9tb3NleHVhbGl0eS4gSG93ZXZlciwgd2UgYWxzbyBmaW5kIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gcmVsaWdpb3VzIGJlbGllZiBhbmQgcmVsaWdpb3VzIHByYWN0aWNlLiBQZW9wbGUgd2hvIGFyZSBzaW1pbGFybHkgY29uc2VydmF0aXZlIGluIHJlbGlnaW91cyBiZWxpZWYgZGlmZmVyIGluIHRoZWlyIHBvbGl0aWNhbCB2aWV3cyBkZXBlbmRpbmcgb24gaG93IG11Y2ggdGhleSBwcmFjdGljZSB0aGVpciBmYWl0aC4gVGhvc2Ugd2hvIHByYWN0aWNlIHRoZWlyIGZhaXRoIG1vcmUgdGVuZCB0byBiZSBzbGlnaHRseSBtb3JlIGxpYmVyYWwgcG9saXRpY2FsbHkgYXMgd2VsbC4KClRoaXMgd2FzIGEgcHJlbGltaW5hcnkgYW5hbHlzaXMsIGFuZCB0aGVzZSBjb25jbHVzaW9ucyBhcmVuJ3QgZmlybS4gQnV0IHRoZXkgZG8gaW5kaWNhdGUgdGhlIG5hdHVyZSBvZiBwb2xpdGljcyBhbmQgcmVsaWdpb24gaW4gQW1lcmljYSB0b2RheSwgYW5kIHRoZSBpc3N1ZXMgdGhhdCBkaXZpZGUgdXMgYW5kIHVuaXRlIHVzLiBBbHNvLCB3ZSBzaG91bGRuJ3QganVzdCB0aGluayBvZiByZWxpZ2lvdXMgaWRlbnRpdHkgYXMgYSBsaXN0IG9mIHF1ZXN0aW9ucyBidXQgYWxzbyBhcyBhIGxpc3Qgb2YgcHJhY3RpY2VzLiBXaGVuIHdlIG5vdGUgdGhhdCBjZXJ0YWluIHBvbGl0aWNhbCBpc3N1ZXMgdGVuZCB0byBkaXZpZGUgQW1lcmljYW5zIG9uIGJvdGggcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgZ3JvdW5kcywgd2UgY2FuJ3QgYXNzdW1lIHRoYXQgYWxsIEFtZXJpY2FucyBhcmUgZXF1YWxseSBkZXZvdGVkIHRvIHRoZWlyIHJlbGlnaW91cyB0cmFkaXRpb25zIGV2ZW4gaWYgdGhleSBiZWxpZXZlIHRoZW0gdG8gYmUgdHJ1ZS4gQXMgaXMgb2Z0ZW4gdGhlIGNhc2UsIHJlYWxpdHkgaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIG91ciBsaW1pdGVkIHBlcnNwZWN0aXZlcyBhbGxvdyBpdCB0byBiZS4=